home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / iutil / get_tid.c < prev    next >
Encoding:
C/C++ Source or Header  |  1986-01-31  |  2.1 KB  |  117 lines

  1. #include    <btree.h>
  2. #include    <sccs.h>
  3.  
  4. SCCSID(@(#)get_tid.c    8.3    1/31/86)
  5.  
  6. /*    GET_TID -- BTree retrieval routine
  7. **
  8. **    Retrieve the tid corresponding to the given lid
  9. **
  10. **    Parameters :
  11. **        tree - BTree filename (I)
  12. **        lid - given lid (I)
  13. **        tid_id - storage information of location of the tid (O)
  14. **
  15. **    Returns :
  16. **        > 0     tid
  17. **        -1     lid corresponds to very last lid in tree
  18. **        -2       lid does not exist
  19. */
  20.  
  21. long
  22. get_tid(rootpage, lid, tid_id)
  23.  
  24. long rootpage;
  25. long lid;
  26. register struct locator *tid_id;
  27. {
  28.     struct BTreeNode    p;
  29.     long            pgno, sum, k, t;
  30.     register int        i;
  31.  
  32. #    ifdef xATR1
  33.     if (tTf(24, 0))
  34.         printf("getting btree tid for lid %ld in rootpage %d\n", lid, rootpage);
  35. #    endif
  36.  
  37.     
  38.     if (lid <= 0)
  39.         return(-2);    /* negative lids nonexistent */
  40.  
  41.     get_node(rootpage, &p);
  42.     pgno = rootpage;
  43.     sum = 0;
  44.     t = 0;
  45.  
  46.     /* find the leaf node containing desired tid */
  47.     while (p.nodetype != 'L')
  48.     {
  49.         if (t == -1)
  50.             /* continue along path to very last lid */
  51.             i = p.nelmts - 1;
  52.         else
  53.         {
  54.             /* find pointer in node which will lead down to proper leaf */
  55.             for (i = 0, k = p.node.intnode.key[0]; sum + k < lid && i < p.nelmts; )
  56.             {
  57.                 sum += k;
  58.                 ++i;
  59.                 if (i < p.nelmts)
  60.                     k = p.node.intnode.key[i];
  61.             }
  62.     
  63.             if (i >= p.nelmts)
  64.             {
  65.                 if (sum < lid - 1)
  66.                     return(-2);    /* lid doesn't exist */
  67.                 else
  68.                 {
  69.                     --i;
  70.                     t = -1;
  71.                 }
  72.             }
  73.         }
  74.  
  75.         pgno = p.node.intnode.ptr[i];
  76.         get_node(pgno, &p);
  77.     }
  78.  
  79.     if (t == -1)
  80.         /* new lid is to be inserted at very last leaf position */
  81.         tid_id->offset = p.nelmts;
  82.     else
  83.     {
  84.         /* search through the leaf for the proper tid */
  85.         for (i = 0, ++sum, t = p.node.leafnode.tid_pos[p.node.leafnode.tid_loc[0]]; sum < lid && i < p.nelmts; )
  86.         {
  87.             ++sum;
  88.             ++i;
  89.             if (i < p.nelmts)
  90.                 t = p.node.leafnode.tid_pos[p.node.leafnode.tid_loc[i]];
  91.         }
  92.         if (i >= p.nelmts)
  93.         {
  94.             if (sum < lid)
  95.                 return(-2);    /* lid doesn't exist */
  96.             else
  97.                 t = -1;
  98.         }
  99.         tid_id->offset = i;
  100.     }
  101.  
  102.     bmove(&p, &tid_id->page, sizeof p);
  103.     tid_id->pageno = pgno;
  104.  
  105. #    ifdef xATR1
  106.     if (tTf(24, 0))
  107.     {
  108.         printf("Main relation tid found in tree:");
  109.         dumptid(&t);
  110.         printf("Btree tid location:");
  111.         dumptid(tid_id);
  112.     }
  113. #    endif
  114.  
  115.     return(t);
  116. }
  117.